#include "listamarcadores.h"
#include <QByteArray>
#include <QDebug>
#include "participante.h"
#include "telajogo.h"
#include "paises.h"
#include <QStringList>

ListaMarcadores::ListaMarcadores(QGraphicsScene *scene, QObject *parent) : QObject(parent)
{
    this->scene = scene;
    this->lista_marcadores = new QList<MarcadorPais*> ();
    this->criarMarcador("Brasil", Qt::blue);
    this->criarMarcador("Africa do Sul", Qt::red);
    this->criarMarcador("Alaska", Qt::yellow);
    this->criarMarcador("Alemanha", Qt::gray);
    this->criarMarcador("Aral", Qt::blue);
    this->criarMarcador("Argelia", Qt::red);
    this->criarMarcador("Argentina", Qt::red);
    this->criarMarcador("Australia", Qt::blue);
    this->criarMarcador("Borneo", Qt::yellow);
    this->criarMarcador("California", Qt::red);
    this->criarMarcador("Chile", Qt::yellow);
    this->criarMarcador("China", Qt::blue);
    this->criarMarcador("Colombia", Qt::yellow);
    this->criarMarcador("Congo", Qt::yellow);
    this->criarMarcador("Dudinka", Qt::yellow);
    this->criarMarcador("Egito", Qt::blue);
    this->criarMarcador("Franca", Qt::yellow);
    this->criarMarcador("Groenlandia", Qt::yellow);
    this->criarMarcador("India", Qt::yellow);
    this->criarMarcador("Inglaterra", Qt::blue);
    this->criarMarcador("Islandia", Qt::yellow);
    this->criarMarcador("Japao", Qt::yellow);
    this->criarMarcador("Labrador", Qt::yellow);
    this->criarMarcador("Mackenzie", Qt::blue);
    this->criarMarcador("Madagascar", Qt::yellow);
    this->criarMarcador("Mexico", Qt::yellow);
    this->criarMarcador("Mongolia", Qt::yellow);
    this->criarMarcador("Moscou", Qt::blue);
    this->criarMarcador("Nova Guine", Qt::yellow);
    this->criarMarcador("Nova York", Qt::yellow);
    this->criarMarcador("Omsk", Qt::yellow);
    this->criarMarcador("Oriente Medio", Qt::blue);
    this->criarMarcador("Ottawa", Qt::yellow);
    this->criarMarcador("Polonia", Qt::yellow);
    this->criarMarcador("Siberia", Qt::yellow);
    this->criarMarcador("Sudao", Qt::blue);
    this->criarMarcador("Suecia", Qt::yellow);
    this->criarMarcador("Sumatra", Qt::yellow);
    this->criarMarcador("Tchita", Qt::yellow);
    this->criarMarcador("Vancouver", Qt::blue);
    this->criarMarcador("Vietna", Qt::yellow);
    this->criarMarcador("Vladivostok", Qt::yellow);

    InformacaoPais::getInstance(TelaJogo::instance);
    InformacaoPais::getInstance()->setGeometry((1200 - InformacaoPais::getInstance()->size().width())/2, 200,
                                                InformacaoPais::getInstance()->size().width(),
                                                InformacaoPais::getInstance()->size().height());
    this->hideAll();

    this->mostrar_ataque = true;

    connect(InformacaoPais::getInstance(), SIGNAL(atacar(QString,QString,int)),
            this, SLOT(realizarAtaque(QString,QString,int)));

    this->aviso = new QMessageBox();
}

void ListaMarcadores::criarMarcador(QString nome_pais, Qt::GlobalColor color)
{
    QString dados = getPais(nome_pais);
    QStringList lista_dados = dados.split(",");

    QString texto = lista_dados.at(0);

    this->lista_marcadores->append(new MarcadorPais(texto, color));

    int pos_x = lista_dados.at(1).toInt();

    int pos_y = lista_dados.at(2).toInt();

    this->lista_marcadores->at(this->lista_marcadores->size()-1)->setPos(pos_x, pos_y);
    this->lista_marcadores->at(this->lista_marcadores->size()-1)->setZValue(1);

    this->scene->addItem(this->lista_marcadores->at(this->lista_marcadores->size()-1));

    int num_vizinhos = lista_dados.at(3).toInt();

    for (int i = 4; i < num_vizinhos + 4; i++) {

        this->lista_marcadores->at(this->lista_marcadores->size()-1)->adicionaVizinho(lista_dados.at(i));
    }

    connect (this->lista_marcadores->at(this->lista_marcadores->size()-1),
             SIGNAL(marcadorClicado(MarcadorPais*,Qt::MouseButton)),
             this, SLOT(mostrarTela(MarcadorPais*,Qt::MouseButton)));
}

void ListaMarcadores::hideAll()
{
    for (int i = 0; i < this->lista_marcadores->size(); i++)
        this->lista_marcadores->at(i)->hide();
}

void ListaMarcadores::showAll()
{
    for (int i = 0; i < this->lista_marcadores->size(); i++)
        this->lista_marcadores->at(i)->show();
}

void ListaMarcadores::mostrarTela(MarcadorPais* marcador_clicado, Qt::MouseButton botao_clicado)
{
    if (this->mostrar_ataque) {

        InformacaoPais::getInstance()->setNomePais(marcador_clicado->getNomePais());
        InformacaoPais::getInstance()->setNomeJogador(marcador_clicado->getNomeJogador());
        InformacaoPais::getInstance()->setNumeroTropas(marcador_clicado->getNumeroTropas());

        QStringList paises_atacaveis;

        qDebug () << "vizinhos" << marcador_clicado->getPaisesVizinhos().size();

        for (int i = 0; i < marcador_clicado->getPaisesVizinhos().size(); i++)
            if (this->donoPais(marcador_clicado->getPaisesVizinhos().at(i)) != this->nome_jogador)
                paises_atacaveis.append(marcador_clicado->getPaisesVizinhos().at(i));

        qDebug () << paises_atacaveis.size();

        InformacaoPais::getInstance()->setPaisesVizinhos(paises_atacaveis);

        if (Participante::instance->vezJogador() && marcador_clicado->getNumeroTropas() > 1 &&
            paises_atacaveis.size() != 0 && this->donoPais(marcador_clicado->getNomePais()) == this->nome_jogador)

            InformacaoPais::getInstance()->ativarAtaque();
        else
            InformacaoPais::getInstance()->desativarAtaque();

        InformacaoPais::getInstance()->show();
    }

    else if (Participante::instance->vezJogador() &&
             Participante::instance->getJogadorAtual() == marcador_clicado->getNomeJogador()) {

        if (botao_clicado == Qt::LeftButton && tropas_disponiveis > 0) {

            marcador_clicado->setTropasAdicionadas(marcador_clicado->getTropasAdicionadas() + 1);
            this->tropas_disponiveis--;
            marcador_clicado->update();
            this->tropasAlocadas(marcador_clicado);
        }

        else if (botao_clicado == Qt::RightButton && marcador_clicado->getTropasAdicionadas() > 0) {

            marcador_clicado->setTropasAdicionadas(marcador_clicado->getTropasAdicionadas() - 1);
            this->tropas_disponiveis++;
            marcador_clicado->update();
            this->tropasAlocadas(marcador_clicado);
        }
    }
}

void ListaMarcadores::mudarEstadoPais(QString text)
{
    QString tag_jogador = "<jogador>";
    QString tag_pais = "<pais>";
    QString tag_tropas = "<tropas>";
    QString tag_cor = "<cor>";
    QString nome_jogador = text.split(tag_jogador).at(1);
    nome_jogador = nome_jogador.split(tag_tropas).at(0);
    QString nome_pais = text.split(tag_pais).at(1);
    nome_pais = nome_pais.split(tag_jogador).at(0);
    QString cor_jogador = text.split(tag_cor).at(1);
    QString num_tropas = text.split(tag_tropas).at(1);
    num_tropas = num_tropas.split(tag_cor).at(0);
    Qt::GlobalColor color;

    if (cor_jogador == "azul")
        color = Qt::blue;
    else if (cor_jogador == "amarelo")
        color = Qt::yellow;
    else if (cor_jogador == "vermelho")
        color = Qt::red;
    else if (cor_jogador == "preto")
        color = Qt::black;
    else if (cor_jogador == "branco")
        color = Qt::white;
    else if (cor_jogador == "verde")
        color = Qt::green;

    int i;

    for (i = 0; i < this->lista_marcadores->size(); i++) {
        if (this->lista_marcadores->at(i)->getNomePais() == nome_pais)
            break;
    }

    this->lista_marcadores->at(i)->setDonoPais(nome_jogador);
    this->lista_marcadores->at(i)->setCor(color);
    this->lista_marcadores->at(i)->setNumeroTropas(num_tropas.toInt());
    this->lista_marcadores->at(i)->update();
    this->lista_marcadores->at(i)->show();
}

void ListaMarcadores::paisConquistado(QString text)
{
    QString tag_jogador = "<jogador>";
    QString tag_pais = "<pais>";
    QString tag_tropas = "<tropas>";
    QString tag_cor = "<cor>";
    QString nome_jogador = text.split(tag_jogador).at(1);
    nome_jogador = nome_jogador.split(tag_tropas).at(0);
    QString nome_pais = text.split(tag_pais).at(1);
    nome_pais = nome_pais.split(tag_jogador).at(0);
    QString cor_jogador = text.split(tag_cor).at(1);
    QString num_tropas = text.split(tag_tropas).at(1);
    num_tropas = num_tropas.split(tag_cor).at(0);
    Qt::GlobalColor color;

    if (cor_jogador == "azul")
        color = Qt::blue;
    else if (cor_jogador == "amarelo")
        color = Qt::yellow;
    else if (cor_jogador == "vermelho")
        color = Qt::red;
    else if (cor_jogador == "preto")
        color = Qt::black;
    else if (cor_jogador == "branco")
        color = Qt::white;
    else if (cor_jogador == "verde")
        color = Qt::green;

    int i;

    for (i = 0; i < this->lista_marcadores->size(); i++) {
        if (this->lista_marcadores->at(i)->getNomePais() == nome_pais)
            break;
    }

    this->lista_marcadores->at(i)->setDonoPais(nome_jogador);
    this->lista_marcadores->at(i)->setCor(color);
    this->lista_marcadores->at(i)->setNumeroTropas(num_tropas.toInt());
    this->lista_marcadores->at(i)->update();
    this->lista_marcadores->at(i)->show();

    this->aviso->setText("Pais " + nome_pais + " foi conquistado pelo jogador " + nome_jogador);
    this->aviso->show();
}

QString ListaMarcadores::donoPais(QString nome_pais)
{
    int i;
    for (i = 0; i < this->lista_marcadores->size(); i++) {
        if (this->lista_marcadores->at(i)->getNomePais() == nome_pais)
            break;
    }
    return this->lista_marcadores->at(i)->getNomeJogador();
}

void ListaMarcadores::tropasAlocadas(MarcadorPais* marcador_alterado)
{
    emit this->mudancaSoldadosDisponiveis(this->tropas_disponiveis);

    int j = this->paises_alterados.indexOf(marcador_alterado);

    if (j != -1)
        this->paises_alterados.removeAt(j);

    if (marcador_alterado->getTropasAdicionadas() != 0)
        this->paises_alterados.append(marcador_alterado);

    if (this->tropas_disponiveis == 0)
        emit this->mostrarBotaoConfirmar();
    else
        emit this->esconderBotaoConfirmar();
}

void ListaMarcadores::alocacaoConfirmada()
{
    InformacaoPais::getInstance()->close();
    for (int i = 0; i < paises_alterados.size(); i++) {

        this->paises_alterados.at(i)->setNumeroTropas(this->paises_alterados.at(i)->getNumeroTropas() +
                                                      this->paises_alterados.at(i)->getTropasAdicionadas());
        this->paises_alterados.at(i)->setTropasAdicionadas(0);
    }
    QList<MarcadorPais*> alteracoes = this->paises_alterados;
    this->paises_alterados.clear();
    this->esconderBotaoConfirmar();
    this->mostrar_ataque = true;
    emit this->enviarMudancasAlocacao(alteracoes);
    emit this->mostrarBotaoPassarVez();
}

void ListaMarcadores::mudancaTropaPais(QString texto)
{
    QString tag_pais = "<pais>";
    QString tag_tropas = "<numero_tropas>";
    QString nome_pais = texto.split(tag_pais).at(1);
    nome_pais = nome_pais.split(tag_tropas).at(0);
    QString tropas = texto.split(tag_tropas).at(1);
    int num_tropas = tropas.toInt();
    int index;

    for (index = 0; index < this->lista_marcadores->size(); index ++)
        if (this->lista_marcadores->at(index)->getNomePais() == nome_pais)
            break;

    this->lista_marcadores->at(index)->setNumeroTropas(num_tropas);
    this->lista_marcadores->at(index)->update();
}

void ListaMarcadores::realizarAtaque(QString pais_atacante, QString pais_defensor, int num_tropas_ataque)
{
    int index;

    for (index = 0; index < this->lista_marcadores->size(); index++)
        if (this->lista_marcadores->at(index)->getNomePais() == pais_defensor)
            break;

    int num_tropas_defesa = this->lista_marcadores->at(index)->getNumeroTropas();

    if (num_tropas_defesa > 3)
        num_tropas_defesa = 3;

    QString texto = "<tipo>atq<pais_atacante>" + pais_atacante + "<tropas_ataque>" + QString::number(num_tropas_ataque) +
                    "<pais_defensor>" + pais_defensor + "<tropas_defesa>" + QString::number(num_tropas_defesa);

    InformacaoPais::getInstance()->close();

    emit this->ataqueDeclarado(texto);
}

void ListaMarcadores::tropasRecebidas (int novas_tropas)
{
    this->mostrar_ataque = false;
    this->tropas_disponiveis = novas_tropas;
}
